package com.elguile.laptop.vista;

import java.awt.TrayIcon.MessageType;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;

import javax.naming.LimitExceededException;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.JSpinner.NumberEditor;
import javax.swing.table.DefaultTableModel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.JTextField;
import javax.swing.JButton;

import com.elguile.laptop.baseDatos.RepositorioVenta;
import com.elguile.laptop.casoDeUso.RegistroDeVenta;
import com.elguile.laptop.entidades.Linea;
import com.elguile.laptop.entidades.RelojFalso;
import com.elguile.laptop.entidades.Venta;
import java.awt.Rectangle;
import java.awt.Color;

public class PanVenta extends JPanel {

	private static final long serialVersionUID = 1L;
	private JTextField txtDescripcion;
	private JTable table;
	private JTextField txtRoberto;
	private JTextField txtTotal;
	private JTextField txtFecha;
	private JTextField txtCodigo;
	private JTextField txtCamtidadDeLineas;
	private JTextField txtJuanPeres;
	private JTextField textField_4;
	final DefaultTableModel contenidoDeTabla = new DefaultTableModel(
			new String[] { "Cantidad", "Descripcion", "precio" }, 0);
	final JSpinner spnCantidad = new JSpinner();
	final JSpinner spnPrecio = new JSpinner();
	private final RegistroDeVenta registroDeVenta;
	private Venta venta = new Venta();

	public PanVenta(RegistroDeVenta registroDeVenta) {
		this.registroDeVenta = registroDeVenta;
		initUi();

	}

	public PanVenta() {
		
		registroDeVenta = new RegistroDeVenta(new RepositorioVenta(),null);
		initUi();

	}

	public void initUi() {
		setLayout(null);
		setBounds(new Rectangle(0, 0, 584, 413));

		JLabel lblCantidad = new JLabel("cantidad");
		lblCantidad.setBounds(260, 147, 55, 16);
		add(lblCantidad);

		spnCantidad.setModel(new SpinnerNumberModel(10, 1, 9999, 1));
		spnCantidad.setBounds(316, 141, 55, 28);
		add(spnCantidad);

		txtDescripcion = new JTextField();
		txtDescripcion.setBounds(87, 140, 171, 28);
		add(txtDescripcion);
		txtDescripcion.setColumns(10);

		JLabel lblDescripcion = new JLabel("Descripcion:");
		lblDescripcion.setBounds(17, 147, 73, 16);
		add(lblDescripcion);

		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(6, 175, 569, 125);
		add(scrollPane);

		table = new JTable();
		table.setEnabled(false);
		table.setModel(contenidoDeTabla);
		scrollPane.setViewportView(table);

		JButton btnAgregar = new JButton("Agregar");
		btnAgregar.setBounds(485, 141, 90, 28);
		add(btnAgregar);

		txtRoberto = new JTextField();
		txtRoberto.setText("Roberto");
		txtRoberto.setEnabled(false);
		txtRoberto.setBounds(87, 73, 122, 28);
		add(txtRoberto);
		txtRoberto.setColumns(10);

		JLabel lblUsuario = new JLabel("Usuario:");
		lblUsuario.setBounds(35, 79, 55, 16);
		add(lblUsuario);

		txtTotal = new JTextField();
		txtTotal.setText("0.0");
		txtTotal.setEnabled(false);
		txtTotal.setBounds(530, 309, 45, 28);
		add(txtTotal);
		txtTotal.setColumns(10);

		JLabel lblTotal = new JLabel("Costo:");
		lblTotal.setBounds(485, 318, 38, 16);
		add(lblTotal);

		JButton btnConfirmar = new JButton("Confirmar");
		btnConfirmar.setBounds(485, 376, 90, 28);
		add(btnConfirmar);

		JLabel lblFecha = new JLabel("Fecha:");
		lblFecha.setBounds(49, 52, 41, 16);
		add(lblFecha);

		txtFecha = new JTextField();
		txtFecha.setText("-");
		txtFecha.setEnabled(false);
		txtFecha.setBounds(87, 46, 122, 28);
		add(txtFecha);
		txtFecha.setColumns(10);

		JLabel lblCodigo = new JLabel("Codigo:");
		lblCodigo.setBounds(45, 24, 45, 16);
		add(lblCodigo);

		txtCodigo = new JTextField();
		txtCodigo.setEnabled(false);
		txtCodigo.setText("-");
		txtCodigo.setBounds(87, 18, 122, 28);
		add(txtCodigo);
		txtCodigo.setColumns(10);

		JLabel lblTotalLineas = new JLabel("Cantidad de Lineas:");
		lblTotalLineas.setBounds(410, 346, 115, 16);
		add(lblTotalLineas);

		txtCamtidadDeLineas = new JTextField();
		txtCamtidadDeLineas.setText("0");
		txtCamtidadDeLineas.setEnabled(false);
		txtCamtidadDeLineas.setColumns(10);
		txtCamtidadDeLineas.setBounds(530, 342, 45, 28);
		add(txtCamtidadDeLineas);

		JLabel lblCliente = new JLabel("Cliente:");
		lblCliente.setBounds(45, 113, 45, 16);
		add(lblCliente);

		txtJuanPeres = new JTextField();
		txtJuanPeres.setText("Juan Peres");
		txtJuanPeres.setEnabled(false);
		txtJuanPeres.setColumns(10);
		txtJuanPeres.setBounds(87, 106, 122, 28);
		add(txtJuanPeres);

		JButton btnBuscar = new JButton("Buscar");
		btnBuscar.setBounds(371, 106, 79, 26);
		add(btnBuscar);

		JLabel lblDni = new JLabel("DNI:");
		lblDni.setBounds(212, 111, 26, 16);
		add(lblDni);

		textField_4 = new JTextField();
		textField_4.setText("12345678");
		textField_4.setEnabled(false);
		textField_4.setColumns(10);
		textField_4.setBounds(240, 105, 122, 28);
		add(textField_4);

		JLabel lblPrecio = new JLabel("Precio");
		lblPrecio.setBounds(381, 147, 55, 16);
		add(lblPrecio);

		spnPrecio.setModel(new SpinnerNumberModel(0.1, 0.1, null, 0.1));
		spnPrecio.setBounds(428, 141, 55, 28);
		add(spnPrecio);

		JButton btnNuevo = new JButton("Nuevo");
		btnNuevo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				presionoNuevo();
			}

		});
		btnNuevo.setBounds(393, 376, 90, 28);
		add(btnNuevo);

		setVenta(new Venta());

		btnAgregar.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {

				agregarLinea();

			}

		});

		btnConfirmar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				precionoConfirmar();
			}

		});
	}

	public void agregarLinea() {
		try {
			registroDeVenta.agrega(obtnerLineaDeLaVista());
			setVenta(registroDeVenta.getVenta());
		} catch (Exception exception) {
			mostrarError(exception);
		}
	}

	public Linea obtnerLineaDeLaVista() {
		return new Linea((Integer) spnCantidad.getValue(),
				txtDescripcion.getText(), new BigDecimal(
						obtenElTexto(spnPrecio)));
	}

	public String obtenElTexto(final JSpinner spnPrecio) {
		return ((NumberEditor) (spnPrecio.getEditor())).getTextField()
				.getText().replaceAll(",", ".");
	}

	public void mostrarError(Exception exception) {
		Mensaje.instancia().error(RegistroDeVenta.class.getSimpleName(),
				exception.getMessage());
	}

	public void setVenta(Venta venta) {
		this.venta = venta;
		actulisarLaVista();
	}

	public void actulisarLaVista() {
		llenarCabesara();
		limpiarCamposDeIngresoLinea();
		llenarTabla();
		llenarDetalles();
	}

	private void llenarCabesara() {
		txtCodigo.setText(codigoComoCadena());
		txtFecha.setText(fechaComoCadena());
	}

	public String fechaComoCadena() {
		if (venta.getFecha() == null) {
			return "-";
		}

		return "" + venta.getFecha();
	}

	public String codigoComoCadena() {
		if (venta.getCodigoVenta() == null) {
			return "-";
		}

		return "" + venta.getCodigoVenta();
	}

	private void limpiarCamposDeIngresoLinea() {
		spnCantidad.setValue(new Integer(1));
		spnPrecio.setValue(new Double(1.0));
		txtDescripcion.setText("");

	}

	public void llenarTabla() {
		contenidoDeTabla.setRowCount(0);
		for (int indice = 0; indice <= venta.getCantidadLineas() - 1; indice++) {
			Linea linea = venta.getLinea(indice);
			contenidoDeTabla.addRow(new Object[] { linea.getCantidad(),
					linea.getDescripcion(), linea.getPrecio() });
		}
	}

	public void llenarDetalles() {
		txtCamtidadDeLineas.setText("" + venta.getCantidadLineas());
		txtTotal.setText("" + venta.obtnerTotal());
	}

	public void precionoConfirmar() {
		try {
			registroDeVenta.registrar();
			setVenta(registroDeVenta.getVenta());
			limpiarCamposDeIngresoLinea();
			mostraMensajeRegistroSatisfactorio();
		} catch (Exception exception) {
			mostrarError(exception);

		}
	}

	public void mostraMensajeRegistroSatisfactorio() {
		Mensaje.instancia().muestra(RegistroDeVenta.class.getSimpleName(),
				"se registro satisfactorio", MessageType.INFO);
	}

	private void presionoNuevo() {
		registroDeVenta.limpiar();
		limpiarCamposDeIngresoLinea();
		setVenta(new Venta());
	}

}
